package br.com.virtual.base.service.impl;

import java.io.IOException;

import javax.ejb.EJB;
import javax.ejb.Local;
import javax.ejb.Stateless;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;

import br.com.virtual.base.enums.SessionNameEnum;
import br.com.virtual.base.enums.TipoPessoaEnum;
import br.com.virtual.base.service.AutenticacaoService;
import br.com.virtual.base.uteis.CriptografiaUtil;
import br.com.virtual.cadastrar.model.PessoaFisica;
import br.com.virtual.cadastrar.model.PessoaJuridica;
import br.com.virtual.cadastrar.model.Usuario;
import br.com.virtual.cadastrar.service.UsuarioService;

@Stateless
@Local(AutenticacaoService.class)
public class AutenticacaoServiceImpl implements AutenticacaoService {

	private Usuario usuarioAutenticado;

	@EJB
	private UsuarioService usuarioService;

	// @EJB
	// private VendaService vendaService;

	@Override
	public boolean autenticarUsuario(String email, String senha) {

		Usuario usuario = usuarioService.read(email);

		try {
			if (usuario != null
					&& usuario.getSenha().equals(
							CriptografiaUtil.criptografa(senha))) {

				// USUÁRIO LOGADO

				this.usuarioAutenticado = usuario;

				HttpSession session = (HttpSession) FacesContext
						.getCurrentInstance().getExternalContext()
						.getSession(true);
				session.setAttribute(Usuario.class.toString(), usuario);
				
				session.setAttribute(SessionNameEnum.NOME_USUARIO_EXIBIR.toString(), nomeUsuarioExibir(usuario));
				
				// this.recuperarCarrinhoUsuario();

				return true;

			}
		} catch (/* NoSuchAlgorithmException */Exception e) {

			System.err
					.println("EXCESSÃO AO CRIPTOGRAFAR SENHA DIGITADA NO LOGIN.");
			e.printStackTrace();
		}

		return false;
	}

	@Override
	public boolean hasUsuarioAutenticado() {

		this.usuarioAutenticado = getUsuarioSession();
		if (this.usuarioAutenticado != null)
			return true;

		return false;
	}

	@Override
	public Usuario usuarioAutenticado() {

		if (hasUsuarioAutenticado()) {

			return this.usuarioAutenticado;
		}

		this.redirectToLogin();
		return null;
	}

	@Override
	public void redirectToLogin() {

		try {
			FacesContext.getCurrentInstance().getExternalContext()
					.redirect("/autenticar/autenticar.jsf");
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

	private Usuario getUsuarioSession() {

		HttpSession session = (HttpSession) FacesContext.getCurrentInstance()
				.getExternalContext().getSession(true);
		return (Usuario) session.getAttribute(Usuario.class.toString());
	}

	@Override
	public void logout() {
		HttpSession session = (HttpSession) FacesContext.getCurrentInstance()
				.getExternalContext().getSession(true);
		session.setAttribute(Usuario.class.toString(), null);

		this.usuarioAutenticado = null;
	}

	
	private String nomeUsuarioExibir(Usuario usuario) {

		if (usuario != null) {
			if (usuario.getPessoa().getTipoPessoa().equals(TipoPessoaEnum.FISICA)) {

				PessoaFisica pf = (PessoaFisica) usuario.getPessoa();
				if (pf.getApelido() == null || pf.getApelido().isEmpty())
					return pf.getNome();
				else
					return pf.getApelido();
			} else if (usuario.getPessoa().getTipoPessoa()
					.equals(TipoPessoaEnum.JURIDICA)) {

				PessoaJuridica pj = (PessoaJuridica) usuario.getPessoa();
				return pj.getContato();
			}

		}

		return "";
	}
	
	
	
	// @Override
	// public void recuperarCarrinhoUsuario() {
	//
	// Venda carrinho;
	// if (this.usuarioAutenticado != null) {
	//
	// carrinho = this.usuarioAutenticado.getPessoa().getCarrinho();
	// carrinho.setItens(new ArrayList<ItemVenda>(this.vendaService
	// .getItens(carrinho)));
	//
	// if (carrinho != null) {
	//
	// CarrinhoMB carrinhoMB = (CarrinhoMB) this
	// .getManagedBean("carrinhoMB");
	//
	// for (ItemVenda item : carrinho.getItens())
	// carrinhoMB.addItemVendaCarrinho(item);
	//
	// carrinhoMB.gravarCarrinho();
	// }
	// }
	// }

	// private Object getManagedBean(String beanName) {
	// FacesContext fc = FacesContext.getCurrentInstance();
	// Object bean;
	// try {
	// ELContext elContext = fc.getELContext();
	// bean = elContext.getELResolver()
	// .getValue(elContext, null, beanName);
	// } catch (RuntimeException e) {
	// throw new FacesException(e.getMessage(), e);
	// }
	//
	// if (bean == null) {
	// throw new FacesException(
	// "Managed bean with name '"
	// + beanName
	// +
	// "' was not found. Check your faces-config.xml or @ManagedBean annotation.");
	// }
	//
	// return bean;
	// }
}